package com.wasion.core.db.storage;

import java.util.List;

import android.content.Context;

import com.wasion.core.db.orm.dao.BaseDaoImpl;
import com.wasion.core.db.storage.SqliteStorageListener.DataInsertListener;
import com.wasion.core.db.storage.SqliteStorageListener.DataQueryListener;
import com.wasion.core.db.storage.SqliteStorageListener.DataUpdateListener;
import com.wasion.core.task.TaskItem;
import com.wasion.core.task.TaskListListener;
import com.wasion.core.task.TaskListener;
import com.wasion.core.task.TaskQueue;

/**
 * 
 * @ClassName: SqliteStorage
 * @Description: Sqlite存储实例, 采用单例模式, 封装对sqlite数据库的CRUD操作
 * @author 高意
 * @date 2014年7月23日 下午1:54:47
 * 
 */
public class SqliteStorage {

	/** The m context. */
	@SuppressWarnings("unused")
	private static Context mContext;

	private static SqliteStorage mSqliteStorage = null;

	/** The m ab task queue. */
	private static TaskQueue mAbTaskQueue = null;

	/** The error code100. */
	private int errorCode100 = 100;

	/** The error message100. */
	private String errorMessage100 = "参数错误";

	/** The error code101. */
	private int errorCode101 = 101;

	/** The error message101. */
	private String errorMessage101 = "执行时错误";

	/** The ret value. */
	private long retValue = -1;

	/**
	 * 描述：获取存储实例.
	 * 
	 * @param context
	 *            the context
	 * @return single instance of SqliteStorage
	 */
	public static SqliteStorage getInstance(Context context) {
		mContext = context;
		if (null == mSqliteStorage) {
			mSqliteStorage = new SqliteStorage(context);
		}
		// 用队列避免并发访问数据库问题
		mAbTaskQueue = TaskQueue.getInstance();
		return mSqliteStorage;
	}

	/**
	 * Instantiates a new ab sqlite storage.
	 * 
	 * @param context
	 *            the context
	 */
	private SqliteStorage(Context context) {
		super();
	}

	/**
	 * 描述：插入数据.
	 * 
	 * @param <T>
	 *            the generic type
	 * @param entity
	 *            实体类 设置了对象关系映射
	 * @param dao
	 *            实现BaseDaoImpl的Dao
	 * @param paramDataInsertListener
	 *            返回监听器
	 */
	public <T> void insertData(final T entity, final BaseDaoImpl<T> dao,
			final DataInsertListener paramDataInsertListener) {

		if (entity != null) {

			TaskItem item = new TaskItem();
			item.listener = new TaskListener() {

				@Override
				public void update() {
					if (retValue >= 0) {
						if (paramDataInsertListener != null) {
							paramDataInsertListener.onSuccess(retValue);
						}
					} else {
						if (paramDataInsertListener != null) {
							paramDataInsertListener.onFailure(errorCode101,
									errorMessage101);
						}
					}
				}

				@Override
				public void get() {
					// 执行插入
					// (1)获取数据库
					dao.startWritableDatabase(false);
					// (2)执行
					retValue = dao.insert(entity);
					// (3)关闭数据库
					dao.closeDatabase(false);
				}
			};
			mAbTaskQueue.execute(item);

		} else {
			if (paramDataInsertListener != null) {
				paramDataInsertListener
						.onFailure(errorCode100, errorMessage100);
			}
		}

	}

	/**
	 * 描述：插入数据.
	 * 
	 * @param <T>
	 *            the generic type
	 * @param entityList
	 *            实体类 设置了对象关系映射
	 * @param dao
	 *            实现AbDBDaoImpl的Dao
	 * @param paramDataInsertListener
	 *            返回监听器
	 */
	public <T> void insertData(final List<T> entityList,
			final BaseDaoImpl<T> dao,
			final DataInsertListener paramDataInsertListener) {

		if (entityList != null) {

			TaskItem item = new TaskItem();
			item.listener = new TaskListener() {

				@Override
				public void update() {
					if (retValue >= 0) {
						if (paramDataInsertListener != null) {
							paramDataInsertListener.onSuccess(retValue);
						}
					} else {
						if (paramDataInsertListener != null) {
							paramDataInsertListener.onFailure(errorCode101,
									errorMessage101);
						}
					}
				}

				@Override
				public void get() {
					// 执行插入
					// (1)获取数据库
					dao.startWritableDatabase(false);
					// (2)执行
					retValue = dao.insertList(entityList);
					// (3)关闭数据库
					dao.closeDatabase(false);

				}
			};
			mAbTaskQueue.execute(item);

		} else {
			if (paramDataInsertListener != null) {
				paramDataInsertListener
						.onFailure(errorCode100, errorMessage100);
			}
		}

	}
	
	/**
	 * 描述：插入数据.
	 * 
	 * @param <T>
	 *            the generic type
	 * @param sqls
	 *            sql语句集合
	 * @param dao
	 *            实现AbDBDaoImpl的Dao
	 * @param paramDataInsertListener
	 *            返回监听器
	 */
	public <T> void insertDataWithSql(final List<String> sqls,
			final BaseDaoImpl<T> dao,
			final DataInsertListener paramDataInsertListener) {

		if (sqls.size() > 0) {

			TaskItem item = new TaskItem();
			item.listener = new TaskListener() {

				@Override
				public void update() {
					if (retValue >= 0) {
						if (paramDataInsertListener != null) {
							paramDataInsertListener.onSuccess(retValue);
						}
					} else {
						if (paramDataInsertListener != null) {
							paramDataInsertListener.onFailure(errorCode101,
									errorMessage101);
						}
					}
				}

				@Override
				public void get() {
					// 执行插入
					// (1)获取数据库
					dao.startWritableDatabase(false);
					// (2)执行
					dao.insertWithSQL(sqls);
					// (3)关闭数据库
					dao.closeDatabase(false);

				}
			};
			mAbTaskQueue.execute(item);

		} else {
			if (paramDataInsertListener != null) {
				paramDataInsertListener
						.onFailure(errorCode100, errorMessage100);
			}
		}

	}

	/**
	 * Find data.
	 * 
	 * @param <T>
	 *            描述：查询数据
	 * @param storageQuery
	 *            the storage query
	 * @param dao
	 *            实现AbDBDaoImpl的Dao
	 * @param paramDataInsertListener
	 *            返回监听器
	 */
	public <T> void findData(final StorageQuery storageQuery,
			final BaseDaoImpl<T> dao,
			final DataQueryListener paramDataInsertListener) {

		final TaskItem item = new TaskItem();
		item.listener = new TaskListListener() {

			@Override
			public void update(List<?> paramList) {
				if (paramDataInsertListener != null) {
					paramDataInsertListener.onSuccess(paramList);
				}
			}

			@Override
			public void get() {
				List<?> list = null;
				// 执行插入
				// (1)获取数据库
				dao.startReadableDatabase(false);
				// (2)执行
				if (storageQuery.getLimit() != -1
						&& storageQuery.getOffset() != -1) {
					list = dao.queryList(null, storageQuery.getWhereClause(),
							storageQuery.getWhereArgs(),
							storageQuery.getGroupBy(),
							storageQuery.getHaving(), storageQuery.getOrderBy()
									+ " limit " + storageQuery.getLimit()
									+ " offset " + storageQuery.getOffset(),
							null);
				} else {
					list = dao.queryList(null, storageQuery.getWhereClause(),
							storageQuery.getWhereArgs(),
							storageQuery.getGroupBy(),
							storageQuery.getHaving(),
							storageQuery.getOrderBy(), null);
				}
				// (3)关闭数据库
				dao.closeDatabase(false);

				// 设置返回结果
				item.setResult(list);
			}
		};
		mAbTaskQueue.execute(item);

	}

	/**
	 * 描述：修改数据.
	 * 
	 * @param <T>
	 *            the generic type
	 * @param entity
	 *            实体类 设置了对象关系映射
	 * @param dao
	 *            实现AbDBDaoImpl的Dao
	 * @param paramDataInsertListener
	 *            返回监听器
	 */
	public <T> void updateData(final T entity, final BaseDaoImpl<T> dao,
			final DataUpdateListener paramDataInsertListener) {

		if (entity != null) {

			TaskItem item = new TaskItem();
			item.listener = new TaskListListener() {

				@Override
				public void update(List<?> paramList) {
					if (retValue >= 0) {
						if (paramDataInsertListener != null) {
							paramDataInsertListener.onSuccess(retValue);
						}
					} else {
						if (paramDataInsertListener != null) {
							paramDataInsertListener.onFailure(errorCode101,
									errorMessage101);
						}
					}
				}

				@Override
				public void get() {
					// 执行插入
					// (1)获取数据库
					dao.startWritableDatabase(false);
					// (2)执行
					retValue = dao.update(entity);
					// (3)关闭数据库
					dao.closeDatabase(false);

				}
			};
			mAbTaskQueue.execute(item);

		} else {
			if (paramDataInsertListener != null) {
				paramDataInsertListener
						.onFailure(errorCode100, errorMessage100);
			}
		}

	}

	/**
	 * 描述：修改数据.
	 * 
	 * @param <T>
	 *            the generic type
	 * @param entityList
	 *            实体类 设置了对象关系映射
	 * @param dao
	 *            实现AbDBDaoImpl的Dao
	 * @param paramDataInsertListener
	 *            返回监听器
	 */
	public <T> void updateData(final List<T> entityList,
			final BaseDaoImpl<T> dao,
			final DataUpdateListener paramDataInsertListener) {

		if (entityList != null) {

			TaskItem item = new TaskItem();
			item.listener = new TaskListener() {

				@Override
				public void update() {
					if (retValue >= 0) {
						if (paramDataInsertListener != null) {
							paramDataInsertListener.onSuccess(retValue);
						}
					} else {
						if (paramDataInsertListener != null) {
							paramDataInsertListener.onFailure(errorCode101,
									errorMessage101);
						}
					}
				}

				@Override
				public void get() {
					// 执行插入
					// (1)获取数据库
					dao.startWritableDatabase(false);
					// (2)执行
					retValue = dao.updateList(entityList);
					// (3)关闭数据库
					dao.closeDatabase(false);

				}
			};
			mAbTaskQueue.execute(item);

		} else {
			if (paramDataInsertListener != null) {
				paramDataInsertListener
						.onFailure(errorCode100, errorMessage100);
			}
		}

	}

	/**
	 * 描述：修改数据.
	 * 
	 * @param <T>
	 *            the generic type
	 * @param storageQuery
	 *            条件实体
	 * @param dao
	 *            实现AbDBDaoImpl的Dao
	 * @param paramDataInsertListener
	 *            返回监听器
	 */
	public <T> void deleteData(final StorageQuery storageQuery,
			final BaseDaoImpl<T> dao,
			final DataUpdateListener paramDataInsertListener) {

		TaskItem item = new TaskItem();
		item.listener = new TaskListener() {

			@Override
			public void update() {
				if (retValue >= 0) {
					if (paramDataInsertListener != null) {
						paramDataInsertListener.onSuccess(retValue);
					}
				} else {
					if (paramDataInsertListener != null) {
						paramDataInsertListener.onFailure(errorCode101,
								errorMessage101);
					}
				}
			}

			@Override
			public void get() {
				// 执行插入
				// (1)获取数据库
				dao.startWritableDatabase(false);
				// (2)执行
				retValue = dao.delete(storageQuery.getWhereClause(),
						storageQuery.getWhereArgs());
				// (3)关闭数据库
				dao.closeDatabase(false);

			}
		};
		mAbTaskQueue.execute(item);
	}

	/**
	 * 描述：释放存储实例.
	 */
	public void release() {
		if (mAbTaskQueue != null) {
			mAbTaskQueue.quit();
		}
	}
}
